﻿
// MenuDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "Menu.h"
#include "MenuDlg.h"
#include "afxdialogex.h"
#include "Game.h"
#include "Setting.h"
#include "resource.h"
#define IDPAUSE 999
#define NEW 0
#define CONTINUE 1

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CmenuDlg 对话框
//主菜单相关


CmenuDlg::CmenuDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MENU_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON);
}

void CmenuDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CmenuDlg, CDialogEx)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_BUTTON_START, &CmenuDlg::OnBnClickedButtonStart)
	ON_BN_CLICKED(IDC_BUTTON_EXIT, &CmenuDlg::OnBnClickedButtonExit)
	ON_BN_CLICKED(IDC_BUTTON_CONTINUE, &CmenuDlg::OnBnClickedButtonContinue)
	ON_BN_CLICKED(IDC_BUTTON_SETTING, &CmenuDlg::OnBnClickedButtonSetting)
END_MESSAGE_MAP()


// CmenuDlg 消息处理程序

BOOL CmenuDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	// 设置此对话框的图标。  当应用程序主窗口不是对话框时，框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标
	
	//读取配置文件
	CFile settingfile;
	settingfile.Open(_T("./Setting.ini"), CFile::modeRead);


	//读取成功，判断是否启用“继续”按钮
	if (settingfile.m_hFile != CFile::hFileNull) {
		settingfile.Close();
		int pause = GetPrivateProfileInt(_T("SETTING"), _T("PAUSE"), 0, _T("./Setting.ini"));
		if (pause == TRUE) {
			CWnd* pWnd = GetDlgItem(IDC_BUTTON_CONTINUE);
			pWnd->EnableWindow(TRUE);
		}
	}
	//读取失败，创建一个配置文件，并输入基本信息
	else {
		settingfile.Open(_T("./Setting.ini"), CFile::modeCreate);
		settingfile.Close();
		WritePrivateProfileString(_T("SETTING"), _T("PAUSE"), _T("0"), _T("./Setting.ini"));			//暂停设为FALSE
		WritePrivateProfileString(_T("SETTING"), _T("SPEED"), _T("1"), _T("./Setting.ini"));			//速度设为1
		WritePrivateProfileString(_T("SNAKE"), _T("BODYAmount"), _T("0"), _T("./Setting.ini"));			//蛇长为0
		WritePrivateProfileString(_T("MAP"), _T("ITEMAmount"), _T("0"), _T("./Setting.ini"));			//食物数量为0
	}


	//初始化主菜单背景
	CBitmap bitMap;
	bitMap.LoadBitmap(IDB_MENU_BACKGROUD);						//读取背景图片
	mBackGroundBrush.CreatePatternBrush(&bitMap);						//创建匹配画刷


	return TRUE;  // 除非将焦点设置到控件，否则返回 TRUE
}

// 如果向对话框添加最小化按钮，则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序，
//  这将由框架自动完成。

void CmenuDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		//绘制背景图片
		CPaintDC dc(this);
		CBrush* pOldBrush = dc.SelectObject(&mBackGroundBrush);		//保存旧画刷
		dc.Rectangle(0, 0, 640, 450);							//选取区域绘制
		dc.SelectObject(pOldBrush);								//画完背景后选取原画刷
	}
}


void CmenuDlg::OnBnClickedButtonStart()
{
	CWnd* pWnd = GetDlgItem(IDC_BUTTON_CONTINUE);
	pWnd->EnableWindow(TRUE);									//启用“继续”按钮
	INT_PTR response;
	do {
		Game gameDlg(nullptr, NEW);								//使用NEW模式创建游戏
		this->ShowWindow(SW_HIDE);								//隐藏主菜单
		response = gameDlg.DoModal();
		this->ShowWindow(SW_SHOW);
		switch (response)										//判断窗口返回结果
		{
		case IDPAUSE:
			WritePrivateProfileString(_T("SETTING"), _T("PAUSE"), _T("1"), _T("./Setting.ini"));
			break;												//退出游戏回到主菜单
		case IDCLOSE:
			WritePrivateProfileString(_T("SETTING"), _T("PAUSE"), _T("1"), _T("./Setting.ini"));
			CDialogEx::OnCancel();								//如果直接关闭游戏界面，主菜单也会一起关闭
			break;
		case IDCANCEL:
			WritePrivateProfileString(_T("SETTING"), _T("PAUSE"), _T("0"), _T("./Setting.ini"));
			pWnd->EnableWindow(FALSE);							//如果取消重新游戏，停用“继续”按钮
		}
	}
	while (response == IDOK);
}


void CmenuDlg::OnBnClickedButtonContinue()
{
	int mode = CONTINUE;										//使用CONTINUE模式创建游戏
	CWnd* pWnd = GetDlgItem(IDC_BUTTON_CONTINUE);
	INT_PTR response;
	do {
		Game gameDlg(nullptr, mode);
		mode = NEW;												//继续游戏之后就设置为新游戏
		this->ShowWindow(SW_HIDE);
		response = gameDlg.DoModal();
		this->ShowWindow(SW_SHOW);
		switch (response)										//判断窗口返回结果
		{
		case IDPAUSE:
			WritePrivateProfileString(_T("SETTING"), _T("PAUSE"), _T("1"), _T("./Setting.ini"));
			break;												//退出游戏回到主菜单
		case IDCLOSE:
			WritePrivateProfileString(_T("SETTING"), _T("PAUSE"), _T("1"), _T("./Setting.ini"));
			CDialogEx::OnCancel();								//如果直接关闭游戏界面，主菜单也会一起关闭
			break;
		case IDCANCEL:
			WritePrivateProfileString(_T("SETTING"), _T("PAUSE"), _T("0"), _T("./Setting.ini"));
			pWnd->EnableWindow(FALSE);							//如果取消重新游戏，停用“继续”按钮
		}
	} while (response == IDOK);
}


void CmenuDlg::OnBnClickedButtonSetting()
{
	Setting settingDlg;
	settingDlg.DoModal();										//打开设置窗口
}


void CmenuDlg::OnBnClickedButtonExit()
{
	CDialogEx::OnCancel();
}
